package com.zb.test;

import com.zb.bean.Employee;
import org.junit.Test;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * 方法引用：若Lambda体重的内容已经有方法实现了，我们可以使用“方法引用”，
 *          (可以理解为方法引用是Lambda表达式的另外一种表现形式)
 *
 *  主要有三种语法格式：
 *      对象::实例方法名
 *      类::静态方法名
 *      类::实例方法名
 *
 *  //条件：函数式接口中抽象方法的参数列表和返回值类型必须和Lambda体重方法的参数列表和返回值类型相同
 */
public class JAVA8_4_方法引用 {

    //测试   对象::实例方法名
    @Test
    public void test1(){
        //普通的Lambda表达式写法
        Consumer<String> consumer = (x) -> System.out.println(x);
        consumer.accept("xxxx");

        //方法引用写法
        PrintStream out = System.out;
        Consumer<Integer> consumer1 = out::println;//不需要写括号()
        consumer1.accept(123);

        //普通Lambda表达式写法
        Employee employee = new Employee(1,"zhangbin",25);
        Supplier<String> supplier = () -> {return employee.getName();};//通过上下文推断可以识别返回值类型是String类型
        Supplier<Integer> supplier1 = () -> employee.getAge(); //如果是有一句代码，return关键字可以省略
        Supplier<Object> supplier2 = () -> employee.getId();
        System.out.println(supplier.get()+","+supplier1.get()+","+supplier2.get());

        //方法引用写法
        Supplier<String> supplier3 = employee::getName;
        Supplier<Integer> supplier4 = employee::getAge;
        System.out.println(supplier3.get()+","+supplier4.get());
    }


    //测试  类::静态方法
    @Test
    public void test2(){
        //一般Lambda表达式写法
        Comparator<Integer> comparator = (x,y)-> Integer.compare(x,y);
        int x = comparator.compare(53,43);//1

        //方法引用写法
         Comparator<Integer> comparator1 = Integer::compare;
         int y = comparator1.compare(32,43);//-1

    }

    //测试   类::实例方法
    @Test
    public void test3(){
        //一般Lambda表达式写法
        BiPredicate<String,String> biPredicate = (x,y) -> x.equals(y);
        System.out.println(biPredicate.test("a","b"));

        //方法引用写法
        //当lambda体中的第一个参数时方法体的调用者，第二个参数时方法体的参数时，可以采用 类::实例方法的格式
        BiPredicate<String,String> biPredicate1 = String::equals;
        biPredicate1.test("a","a");

    }

}
